home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / C005.ZIP / SQRT.C < prev    next >
Text File  |  1990-01-19  |  2KB  |  51 lines

  1. /********************************************************************
  2.  * C Users Group (U.K) C Source Code Library File CUGLIB.005        *
  3.  * Inquiries to: M. Houston, 36 Whetstone Clo. Farquhar Rd.         *
  4.  * Edgbaston, Birmingham B15 2QN ENGLAND                *
  5.  ********************************************************************
  6.  * File name: sqrt.c
  7.  * Program name: library modules only
  8.  * Source of file: The Public Domain Software Library.
  9.  * Purpose: maths function
  10.  * Changes: <who what when & why major changes have been made>      
  11.  ********************************************************************/
  12.  
  13.  
  14. /***********************************************************
  15.  *               The TULSA IBM C BOARD                     *
  16.  *                   918-664-8737                          *
  17.  *             300/1200 XMODEM, 24 Hours                   *
  18.  **********************************************************/
  19.  
  20.  
  21. #include "math.h"
  22. #include "errno.h"
  23.  
  24. double sqrt(x)
  25. double x;
  26. {
  27.         double f, y;
  28.         int n;
  29.         extern int errno;
  30.  
  31.         if (x == 0.0)
  32.                 return x;
  33.         if (x < 0.0) {
  34.                 errno = EDOM;
  35.                 return 0.0;
  36.         }
  37.         f = frexp(x, &n);
  38.         y = 0.41731 + 0.59016 * f;
  39.         y = (y + f/y);
  40.         y = ldexp(y,-2) + f/y;  /* fast calculation of y2 */
  41.         y = ldexp(y + f/y, -1);
  42.         y = ldexp(y + f/y, -1);
  43.  
  44.         if (n&1) {
  45.                 y *= 0.70710678118654752440;
  46.                 ++n;
  47.         }
  48.         return ldexp(y,n/2);
  49. }
  50.  
  51.